// 第一题
// 如何让下面代码片段输出
if (a == 1 && a == 2 && a == 3) {
    console.log('Are you kidding me ?')
};

// 思路分析
// 1、 一个变量存储多个值 在一个作用域中是不能实现的
// 2、进行作用域拓展
// 3、利用属性特征特性
// 4、利用隐藏式转换原理
// 5、利用隐藏变量

// 方法一：通过width语句
let i = 1;
with({
    get a() {
        return i++;
    }
}) {
    if (a == 1 && a== 2 && a == 3) {
        console.log('Are you kidiing me ?');
    }
};


// 方法二：利用对象的隐式转换原理
// 对象进行比较远算会进行隐式转换：[Symbol.toPrimitive] => valueOf => toString =》 报错
// 数组进行比较远算会进行隐式转换：valueOf => toString => 报错
let a = {
    i: 1,
    // [Symbol.toPrimitive]() {
    //     console.log('重写toPrimitive方法');
    //     return this.i++;
    // },
    // valueOf() {
    //     console.log('重写valueOf方法');
    //     return this.i++;
    // },
    toString() {
        console.log('重写toString方法');
        return this.i++;
    }
}

if (a == 1 && a== 2 && a == 3) {
    console.log('Are you kidiing me ?');
}

// 数组上进行隐式转换会调用join方法
let a = [1, 2, 3];
// 改写toString
a.toString = a.shift;
if (a == 1 && a== 2 && a == 3) {
    console.log('Are you kidiing me ?');
}


// 方法三：数据劫持Object.defineProperty
let j = 1;
Object.defineProperty(window, 'a', {
    get() {
        return j++;
    }
});
if (a == 1 && a== 2 && a == 3) {
    console.log('Are you kidiing me ?');
};


// 方法四：数据劫持Proxy
const a = new Proxy({x: 1}, {
    get(target){
        return _ => target.x++;
    }
})
if (a == 1 && a== 2 && a == 3) {
    console.log('Are you kidiing me ?');
};



// 方法五：隐藏字符U+FFA0(半形朝鲜文填充符)
// https://unicode-table.com/cn/FFA0/
let ifﾠ = () => !0;
ifﾠ(a == 1 && a == 2 && a == 3) 
{
    console.log('Are you kidiing me ?');
}